package zy.blue7.gui.netty.custom.qq.service.impl;

import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import zy.blue7.gui.netty.custom.qq.Server;
import zy.blue7.gui.netty.custom.qq.message.Header;
import zy.blue7.gui.netty.custom.qq.message.LoginMessage;
import zy.blue7.gui.netty.custom.qq.message.Message;
import zy.blue7.gui.netty.custom.qq.message.MessageInfo;
import zy.blue7.gui.netty.custom.qq.message.response.Result;
import zy.blue7.gui.netty.custom.qq.service.MessageHandler;
import zy.blue7.gui.netty.custom.qq.utils.SerializableUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: blue7
 * @Date: 2022/2/27 20:05
 * @Version 1.0
 * @Description
 */
public class LoginMessageHandlerImpl implements MessageHandler {
    @Override
    public void handle(Message message, Channel channel) throws IOException {
        /**
         * 登录就把 当前 channel 放到 容器中
         */
        LoginMessage loginMessage = (LoginMessage) message;
        String username = loginMessage.getUsername();
        String password = loginMessage.getPassword();
        /**
         * 按道理这里会从数据库查询用户名和密码，如果不满足就拒绝登录
         */
        if (null == username || password == null) {
            Result<Boolean> result = Result.failed("用户名或者密码错误...", false);
            byte[] content = SerializableUtils.serializable(result);
            Integer length = content.length;
            Header header = Header.builder()
                    .contentLength(length)
                    .sessionId("0001")
                    .version(1)
                    .build();
            MessageInfo messageInfo = new MessageInfo();
            messageInfo.setHeader(header);
            messageInfo.setMessage(result);

            /**
             * 登录失败就发送失败消息
             */
            ChannelFuture channelFuture = channel.writeAndFlush(messageInfo);
            /**
             * 添加监听器，不管发送成功还是失败， todo 暂时全部直接关闭channel
             */
            channelFuture.addListener(future -> {
//                if (future.isSuccess())
                channel.close();
            });
            System.out.println("登录失败");

        } else {
            /**
             * 如果登录成功，就 将 该channel 放到容器中
             */
            Server.map.put(loginMessage.getFrom(), channel);
//            Server.map.put(loginMessage.getTo(), channel);//测试用的

            List<Channel> list = new ArrayList<>();
            list.add(channel);
            list.add(channel);
            Server.groupMap.put(loginMessage.getTo(), list);//测试用的
        }
        Server.map.put(loginMessage.getFrom(), channel);
        System.out.println("----------");
    }
}
